/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Database.DBConnection;
import Database.PropertiesManager;
import Model.Espaco;
import Model.EspacoRecurso;
import Model.Recurso;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author Maury
 */
public class EspacoRecursoDAO {
    private static HashMap dados;
    
    static{
        try{
    dados = new PropertiesManager("sql.properties").readPropertiesFile();
        } catch (IOException ioe){
            System.out.println(ioe);
        }
    }
    
    public static boolean inserir(int id_espaco, int id_recurso, int quantidade) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(id_espaco < 0 || id_recurso < 0 || quantidade < -1){
            return false;
        }
        
        Espaco espaco = EspacoDAO.PesquisarById(id_espaco);
        Recurso recurso = RecursoDAO.pesquisarById(id_recurso);
        if(espaco == null || recurso == null){
            return false;
        }        
        
        String sql = loadSQL("Insert.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        pstmt.setInt(2, id_recurso);
        pstmt.setInt(3, quantidade);        

        pstmt.executeUpdate(); // tbm funciona com pstmt.execute();
        return true;
        
    } 
    
    public static boolean update(int id_espaco, int id_recurso, int quantidade) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        
        if(id_espaco < 0 || id_recurso < 0 || quantidade < -1){
            return false;
        }
        
        Espaco espaco = EspacoDAO.PesquisarById(id_espaco);
        Recurso recurso = RecursoDAO.pesquisarById(id_recurso);
        if(espaco == null || recurso == null){
            return false;
        }        
        
        String sql = loadSQL("Update.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, quantidade);   
        pstmt.setInt(2, id_espaco);
        pstmt.setInt(3, id_recurso);
                     
        pstmt.execute(); // tbm funciona com pstmt.execute();
        return true;
    } 
    
    public static ArrayList<EspacoRecurso> pesquisarByIdEspaco(int id_espaco) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByIdEspaco.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<EspacoRecurso> esrec = new ArrayList<EspacoRecurso>();
        
        while(rs.next()){
            int id_recurso = rs.getInt("ID_RECURSO");
            int quantidade = rs.getInt("QUANTIDADE");
            EspacoRecurso er = new EspacoRecurso();
            er.setId_espaco(id_espaco);
            er.setId_recurso(id_recurso);
            er.setQuantidade(quantidade);
            esrec.add(er);
        }
        if(esrec.isEmpty()){
            esrec = null;
        }
        
        return esrec;
    }
    
    public static ArrayList<EspacoRecurso> pesquisarByIdRecurso(int id_recurso) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByIdRecurso.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_recurso);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<EspacoRecurso> esrec = new ArrayList<EspacoRecurso>();
        
        while(rs.next()){
            int id_espaco = rs.getInt("ID_ESPACO");
            int quantidade = rs.getInt("QUANTIDADE");
            EspacoRecurso er = new EspacoRecurso();
            er.setId_espaco(id_espaco);
            er.setId_recurso(id_recurso);
            er.setQuantidade(quantidade);
            esrec.add(er);
        }
        if(esrec.isEmpty()){
            esrec = null;
        }
        
        return esrec;
    }
    
    public static ArrayList<Recurso> recursosEspaco(int id) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByIdEspaco.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<Recurso> recursos = new ArrayList<Recurso>();
        while(rs.next()){
            int id_recurso = rs.getInt("ID_RECURSO");
            int quantidade = rs.getInt("QUANTIDADE");
            Recurso r = RecursoDAO.pesquisarById(id_recurso);
            r.setQuantidade_disponivel(quantidade);
            recursos.add(r);
        }
        if(recursos.isEmpty()){
            recursos = null;
        }
        
        return recursos;
    }
    
    public static boolean removerRecurso(int id_recurso) throws SQLException, ClassNotFoundException, IOException{
        Connection conexao = DBConnection.getInstance();
        Recurso recurso = RecursoDAO.pesquisarById(id_recurso);
        
        if(recurso == null){
            return false;
        }
        
        String sql = loadSQL("DeleteRecurso.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_recurso);
        pstmt.execute();
        return true;
    }
    
    public static boolean removerEspaco(int id_espaco) throws SQLException, ClassNotFoundException, IOException {
        Connection conexao = DBConnection.getInstance();
        String sql = loadSQL("SelectByIdEspaco.EspacoRecurso");
        PreparedStatement pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        ResultSet rs = pstmt.executeQuery();
        ArrayList<EspacoRecurso> ers = new ArrayList<EspacoRecurso>();
        while(rs.next()){
            int id_recurso = rs.getInt("ID_RECURSO");
            int quantidade = rs.getInt("QUANTIDADE");
            EspacoRecurso er = new EspacoRecurso();
            er.setId_espaco(id_espaco);
            er.setId_recurso(id_recurso);
            er.setQuantidade(quantidade);
            ers.add(er);
        }
        
        for(EspacoRecurso espRec : ers){
            if(espRec.getQuantidade() > 0){
                RecursoDAO.acrescentarRecurso(espRec.getId_recurso(), espRec.getQuantidade());
            }
        }
        
        sql = loadSQL("DeleteByIdEspaco.EspacoRecurso");
        pstmt = conexao.prepareStatement(sql);
        pstmt.setInt(1, id_espaco);
        pstmt.executeUpdate();
        return true;
    }
    
    private static String loadSQL(String key){
        String sql=null;
        sql = (String) dados.get(key);
        return sql;
    }
}
